/**
 函数changeColor()的作用域链包含两个对象：它自己的变量对象（其中
 定义着arguments 对象）和全局环境的变量对象。可以在函数内部访问变量color，
 就是因为可以在这个作用域链中找到它。
 */
var color = "blue";

function changeColor() {
    if (color === "blue") {
        color = "red";
    } else {
        color = "blue";
    }
}

// changeColor();
// alert("Color is now " + color);

function changeColor2() {
    var anotherColor = "red";

    function swapColors() {
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
        // 这里可以访问color、anotherColor 和tempColor
    }

    // 这里可以访问color 和anotherColor，但不能访问tempColor
    swapColors();
}

// 这里只能访问color
changeColor2();

function buildUrl() {
    var qs = "?debug=true";

    // [延长作用域]

    // 原来的样子：
    //window
    //  |---color
    //  |---buildUrl()    //在buildUrl执行环境中访问window.location.href，写为：location.href

    // 加with语句后：
    //window
    //  |---location
    //  |---color
    //  |---buildUrl()    //在buildUrl执行环境中访问window.location.href，由于临时添加了location作用域，写为：href

    with (location) {
        var url = href + qs;
    }
    return url;
}

buildUrl();

/**
 * 循环引用
 */
function cycleRefer() {
    var objectA = {};//=new Object();
    var objectB = {};
    objectA.someOtherObject = objectB;
    objectB.anotherObject = objectA;
}

/**
 * COM对象循环引用 IE9修复了此问题
 * IE9之前解决方法：
 * myObject.element = null;
 * element.someObject = null;
 */
function cycleReferCom() {
    var element = document.getElementById("some_element");
    var myObject = {};
    myObject.element = element;
    element.someObject = myObject;
}
// 事实上，在有的浏览器中可以触发垃圾收集过程，但我们不建议读者这样做。在
// IE 中，调用window.CollectGarbage()方法会立即执行垃圾收集。在Opera 7 及更
// 高版本中，调用window.opera.collect()也会启动垃圾收集例程。